%\appendix
\chapter{チャット・スクリプト}
\label{chat-script}
ダイアリングとログインの手続きを指定するには、モデムあるいは相手側との
間でのやりとりを、送/受信する文字列を記述することによりおこないます。
この文字列をチャット・スクリプトと呼びます。

\section{指定方法}
チャットスクリプトは基本的に「受信すべき文字列」と それを受信した時に
応答として送出する「送信文字列」を交互に空白で区切ることにより、
一連のやりとりを指定します。チャットスクリプトを最後まで処理した
場合には、そのスクリプトの表現する手続きを成功したとみなし、途中で
一定時間以内に受信すべき文字列が検出できなかった場合には失敗したもの
とみなします。

「受信すべき文字列」と「送信文字列」の指定の際には、表\ref{tab:chatspecial}
に示す特殊シーケンスが指定できます。「送信文字列」を送出する際には、
その文字列に\verb|\c|が含まれていない限り自動的にCRが最後に付加されます。

\begin{table}[htbp]
  \leavevmode
  \begin{center}
    \begin{tabular}[h]{llll}
\verb|\d| & 2秒間の待ちを表現 & \verb|\p| & 0.25秒間の待ちを表現 \\
\verb|\s| & スペースを表現 & \verb|\t| & タブを表現 \\
\verb|\r| & CRを表現 & \verb|\n| & LFを表現 \\
\verb|^X| & Ctrl-X を表現 & \verb|\c| & CRを付加しないことを表現(送信時) \\
\verb|\P| & authkeyで指定した秘密鍵を表現 & 
  \verb|\T| & phoneで指定した電話番号を表現  \\
\verb|\U| & authnameで指定したシステム名を表現 &
  \verb|\\| & バックスラッシュを表現します \\
    \end{tabular}
    \caption{特殊シーケンス}
    \label{tab:chatspecial}
  \end{center}
\end{table}

また、「受信すべき文字列」の指定においてはつぎのような特別な規則があります。

\begin{itemize}
\item TIMEOUTが指定された場合には、次の「送信文字列」はタイムアウトの
  秒数を表現するものと解釈されます。以後、指定された時間以内に
  「受信すべき文字列」が検出できない場合には、チャットの処理は失敗します。
  特にTIMEOUTが指定されない場合には、ディフォルトとして30秒のタイムアウト
  が用いられます。
\item ABORTが指定された場合には、次の「送信文字列」はエラー文字列を
  表現するものと解釈されます。以後、エラー文字列を検出した時点で
  チャットの処理は失敗したものとして扱われます。
\item ハイフン(--)で区切ることにより、
  {\bf (受信文字列1)---(送信文字列)---(受信文字列2)}の3つの部分に分けることが
  できます。この場合には、受信文字列1が検出されれば続く「送信文字列」
  の処理にすすみますが、検出できないばあいには(送信文字列)を送信し、
  (受信文字列2)の検出を待ちます。
\end{itemize}

チャットの途中でパリティを変更するためには次の文字列を指定します。
これらの文字列は「受信すべき文字列」、「送信文字列」のどちらでもない
ものとして解釈されます。

\begin{table}[htbp]
  \leavevmode
  \begin{center}
    \begin{tabular}[h]{ll}
P\_ZERO & 8ビット、パリティ無しに設定します \\
P\_ODD & 7ビット、奇数パリティに設定します \\
P\_EVEN & 7ビット、偶数パリティに設定します \\
    \end{tabular}
    \caption{パリティの指定}
    \label{tab:parity}
  \end{center}
\end{table}

\section{例}
\begin{screen}\baselineskip12pt
  \begin{verbatim}
ppp> show modem
device: /dev/tty01 speed: 38400
cs8, none parity
fd = 0, modem control = 0
outq: 81
DialScript  = ABORT BUSY ABORT NO\sDIALTONE ABORT NO\sCARRIER TIMEOUT 5 "" AT
OK-AT-OK ATDT\T TIMEOUT 30 CONNECT
LoginScript = TIMEOUT 10 gin:-\r-gin: Panon word: Panon
PhoneNumber = 031234567
ppp>
  \end{verbatim}
\end{screen}

上記のような設定がなされている場合には、ダイアリングとログインの
手順はつぎのようになります。

\subsection*{ダイアル手順}
\begin{itemize}
\item BUSY, NO DIALTONE, NO CARRIERのいずれかの文字列を受信した
  時点でダイアリングに失敗したものと判断します。
\item タイムアウトを5秒に設定します。
\item (\verb|""|)は空の「受信すべき文字列」を指定するためのものです。
\item ATを送信し、OKを受信するのを待ちます。5秒以内に受信できなかった
  場合には、再度ATを送出しOKが受信されるのを待ちます。5秒以内に
  受信できなければ、今度は失敗したものと判断します。
\item ATDTコマンドを使ってphoneで指定される電話番号へのダイアリングを
  指示します。すなわち、実際に送出される文字列は、``ATDT031234567''と
  なります。
\item 30秒以内にCONNECTという文字列が検出できれば、すべてのスクリプトが
  処理されたことになるので、ダイアリングに成功したと判断されます。
\end{itemize}

\subsection*{ログイン手順}
\begin{itemize}
\item タイムアウトを10秒に設定します。
\item gin:という文字列を受信するのを待ちます。10秒以内に受信できなければ
  CRを送出し、gin:が受信されるのを待ちます。5秒以内に受信できなければ、
  今度は失敗したものと判断します。
\item ログイン名としてPanonを送出し、word: という文字列が受信されるのを
  待ちます。
\item パスワードとしてPanonを送出します。
\end{itemize}

\chapter{IIJへの接続}
この章ではIIJのダイアルアップPPPサービスを利用するための
設定について説明します。

IIJのPPPサービスでは、login, PAP, CHAPの3種類の認証
方法が利用可能です。これら3種類の認証方法はその方式が異なるだけで、
ユーザはIIJから割り当てられた同一のユーザ名とパスワードを使うことが
できます。ここでは、割り当てられたユーザ名がMyUserName, パスワードが
MyPassowrdであると仮定して説明をすすめることにしましょう。

IIJのサービスでは、ユーザの使用するIPアドレスは動的に割り当てられます。
また、IIJ側のルータのIPアドレスもどのルータに接続されるかによって
変わりますから、前もって知ることはできません。自分側と相手側の双方の
IPアドレスとも未知なものとして接続しなければならないわけです。
そのため、オンディマンドでの接続をするためにはちょっとした
工夫が必要です。

% 以下の例ではすべて対話モードを使って接続することを前提として説明をします。

\section{ppp.conf}
まず最初に共通する要素をdefaultとしてまとめておきます。
ここでは標準的なモデムをトーン式でダイアルすることを想定して
dialスクリプトを記述してありますが、モデムの種類によっては
リザルトコードの表示のされかたが異なることがあるかもしれません。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
default:
 set device /dev/tty01
 set speed 38400
 disable lqr
 deny lqr
 set phone 12345678
 set authname MyUserName
 set authkey  MyPassword
 set dial "ABORT BUSY ABORT NO\\sCARRIR TIMEOUT 5 \"\" AT OK-AT-OK \\dATDT\\T
TIMEOUT 40 CONNECT"
  \end{verbatim}
\end{screen}

次はloginでの認証をおこなう場合の設定例です。ユーザ名とパスワードは
すでにauthnameとauthkeyに設定されていますので、\verb|\U|と\verb|\P|で
参照することができます。起動の際には、{\em ppp iij\/}と指定するだけです。

\begin{screen}\baselineskip12pt
 \begin{verbatim}
iij:
 set login "TIMEOUT 5 login:-\\r-login: \\U word: \\P"
 set timeout 0
 dial
 \end{verbatim}
\end{screen}

PAPを使いたい場合には、PAPを受け付けるように指定するとともに、
能動的にオープンすることを指定します。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
iij-pap:
 accept pap
 set login "TIMEOUT 5 login:-\\r-login:"
 set timeout 0
 set openmode active
 dial
  \end{verbatim}
\end{screen}

CHAPを使う場合には、CHAPを受け付けることを指定するとともに、
PAPを拒否するように指定してください。PAPが受け付け可能になって
いると、CHAPは使われずにPAPが使われるようになってしまいます。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
iij-chap:
 accept chap
 deny pap
 set login "TIMEOUT 5 login:-\\r-login:"
 set timeout 0
 set openmode active
 dial
  \end{verbatim}
\end{screen}

オン・ディマンドで自動的に発呼するためには、前もってディフォルトの
ルーティングを設定しておく必要があります。ここでは、IIJ側のアドレスが
192.244.177.2であると仮定しておきます。実際には着呼する設備やサービス地域
によってはこのアドレスではないかもしれませんが、この問題は後で解決する
こととします。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
iij-demand:
 set login "TIMEOUT 5 login:-\\r-login: \\U word: \\P"
 set ifaddr 0 192.244.177.2/20
 add 0 0 192.244.177.2
  \end{verbatim}
\end{screen}

このように指定しておけば、とりあえずIIJ側のアドレスを192.244.177.2と
想定してルーティングの用意が整います。そこで、

\begin{screen}\baselineskip12pt
  \begin{verbatim}
% ping 192.244.177.1
  \end{verbatim}
\end{screen}
を実行してやれば、このパケットをきっかけに発呼がおこなわれます。
実際にはIIJ側のアドレスは192.244.177.2ではないかもしれませんが、
192.244.177.2/20 と指定してあるために、IIJ側からの指示に従って
アドレスが修正されます。

なお、自動発呼するためには自動モードで動作させる必要がありますから、

\begin{screen}
  \begin{verbatim}
% ppp -auto iij-demand
  \end{verbatim}
\end{screen}
として起動する必要があります。

\section{ppp.linkup}
通常IIJのサービスを利用するのは、インターネットへのアクセスを
するのが目的であると思われます。したがって、ディフォルトルートを
IIJの方に向けてやれば良いことになります。IIJ側のアドレスは前もって
知ることはできませんが、\verb|HISADDR|によって表現することができますので、
以下のように指定すれば接続時にディフォルトルートを設定することが
できます。

自動モードを使った場合には、IIJ側のIPアドレスが仮定したアドレスと
違う場合があることを考慮しなければなりません。そこで、起動時に仮定した
ルーティングをいったん消去してやり、あらためて相手側のアドレスを
ディフォルト・ルートとして登録することにします。

\begin{screen}\baselineskip12pt
  \begin{example}
iij-demand:
 delete ALL
 add 0 0 HISADDR
MYADDR:
 add 0 0 HISADDR
  \end{example}
\end{screen}

\chapter{うまくつながらない場合}
うまくつながらない場合には、PPPの生成するログ・ファイルを
調べることにより、その原因を追求することが可能です。

ディフォルトでは、LCP/IPCPの調停の様子までをログ・ファイルに
出力するようになっていますが、デバックのレベルを変更することにより、
TCPパケット、HDLCパケット、Asyncデータの各段階でのパケットダンプを
とることも可能です。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
ppp> set debug hdlc lcp
ppp>
  \end{verbatim}
\end{screen}

もし、うまく相手とつながらない場合には、上記のようにHDLC, LCP, IPCP
の各レベルでのトレースをとるように設定して生成したログ・ファイルを
大野(tony-o@iij.ad.jp)まで送付してくだされば、原因の調査をお手伝いします。

なお、わたしへの連絡に先だって、以下のような設定を試してみることを
おすすめします。

\begin{itemize}
\item PPPの実装によっては、IPCPの実装が正しくなかったり、古いRFCに
  基づいているものがあります。disable vjcomp, deny vjcompを指定して
  の接続を試してみてください。
\item PPPの実装によっては、IPアドレスの指定が相手側と一致しないと
  接続できないものがあります。{\tt set ifaddr}コマンドを使って
  相手側の設定と同じアドレスを指定してみてください。
\item Free softwareあるいはPC用のPPPのほとんどはLQRを実装していません。
  disable lqrを指定しての接続を試してみてください。また、CCPもほとんど
  実装されていませんので、disable pred1をも指定してみてください。
\end{itemize}

\chapter{Known Problem}
\begin{itemize}
\item 現在、saveコマンドは実装されていません。
\item PPPデーモンはsetuid rootで動作します。telnetによる接続の受付には
  なんの認証機能も用意されていないので、誰でも現在動作しているリンクを
  切断あるいはデーモンの動作を終了させることができてしまいます。
\item LQRのプロトコルは実装されていますが、それにもとづいたLQMポリシーを
  制御することはできません。
\item PAP/CHAPの実装において、パケットの再送機能が実装されていません。
\item 自動モードで動作している状態では、同一の組のアドレスを使用する
  直接モードのPPPを新たに起動することができません。すなわち、自動モードで
  自動発呼できるような状態では、相手側からの着信を受けて接続することが
  できません。
\item アイドルタイマーが計測する時間は正確ではありません。
\item LCP/IPCPは、必要最低限の実装にはなっていますが、正確にRFCに定められる
  機能を実装してはいません。そのためRFC1661に対応していない部分もあります。
  またRFC1570には対応していません。
\item 現在実装されているCCPおよびPredictor--1による圧縮機能は、
  Internet draftの仕様に基づいています。今後のIETFでの議論によっては
  仕様の変更や廃止があるかもしれません。
\end{itemize}

% Local Variables: 
% mode: japanese-LaTeX
% TeX-master: "guide"
% End: 
